По смыслу эти два класса похожи. И тот и другой умеет хранить строки. Только один это элемент графического интерфейса, а другой контейнер для строк. Наша задача научиться обмениваться данными между ними вручную. То есть не используя DDX, а путем создания нашей функции.
Итак, создаем приложение на основе диалогового окна с именем TestString. Помещаем на него элемент управления CListBox и связываем с ним класс (Control) вот так.
class CTestStringDlg : public CDialog
{
......
// Dialog Data
//{{AFX_DATA(CTestStringDlg)
enum { IDD = IDD_TESTSTRING_DIALOG };
CListBox m_ListBox;
......
Там же создаем массив на основе класса CStringArray.
class CTestStringDlg : public CDialog
{
// Construction
......
public:
CStringArray csArray;
......
Теперь создадим функцию передачи строк в элемент управления и из него.
class CTestStringDlg : public CDialog
{
// Construction
public:
void TransferData(CListBox* cl, BOOL blGoy);
CStringArray csArray;
......
И ее реализация:
void CTestStringDlg::TransferData(CListBox* cl, BOOL blGoy)
{
CString st;
if (blGoy)
{
for (int i=0; i < csArray.GetSize();i++)
{
st=csArray[i];
cl->AddString(st);
}
}
else
{
int iSize;
iSize=cl->GetCount();
csArray.RemoveAll();
for (int i=0;i < iSize;i++)
{
cl->GetText(i,st);
csArray.Add(st);
}
}
Как видите при установке флага blGoy данные либо пересылаются в массив, либо из него. Теперь нам надо дописать код в OnInitDialog для того, чтобы инициализировать набор строк при запуске диалога:
////////////////////////////////
// CTestStringDlg message handlers
BOOL CTestStringDlg::OnInitDialog()
{
CDialog::OnInitDialog();
...........
// TODO: Add extra initialization here
csArray.Add("Hello");
csArray.Add("Word");
TransferData(&m_ListBox,TRUE);
return TRUE; // return TRUE unless you set the focus to a control
}
И перегрузка нажатия на кнопку для возврата назад.
void CTestStringDlg::OnOK()
{
TransferData(&m_ListBox,FALSE);
CDialog::OnOK();
}
Вот имея такой код, например, можно создать свой класс на основе CListBox более интелектуальней чем базовый.